#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <sys/msg.h>

struct msg_st {
  long int msg_type;
  char text[BUFSIZ];
};

int main() {
  int running = 1;
  int msgid = -1;
  struct msg_st data;
  long int msgtype = 0; //注意1

  //建立消息队列
  msgid = msgget((key_t) 1234, 0666 | IPC_CREAT);
  if (msgid == -1) {
    fprintf(stderr, "msgget failed with error: %d\n", errno);
    exit(EXIT_FAILURE);
  }
  //从队列中获取消息，直到遇到end消息为止
  while (running) {
    if (msgrcv(msgid, (void * ) & data, BUFSIZ, msgtype, 0) == -1) {
      fprintf(stderr, "msgrcv failed with errno: %d\n", errno);
      exit(EXIT_FAILURE);
    }
    printf("You wrote: %s\n", data.text);
    //遇到end结束
    if (strncmp(data.text, "end", 3) == 0)
      running = 0;
  }
  //删除消息队列
  if (msgctl(msgid, IPC_RMID, 0) == -1) {
    fprintf(stderr, "msgctl(IPC_RMID) failed\n");
    exit(EXIT_FAILURE);
  }
  exit(EXIT_SUCCESS);
}
